home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / NOID.PRG < prev    next >
Encoding:
Text File  |  1997-11-27  |  31.0 KB  |  822 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. //TITULO:      NOID
  4. //AUTOR:       DANIEL NAVARRO
  5. //FECHA:       2/15/97
  6. //------------------------------------------------------------------------------
  7.  
  8. PROGRAM noid;
  9.  
  10. CONST
  11.     velocidad_r=8;  // Velocidad máxima de la raqueta
  12.  
  13. GLOBAL
  14.     pequeño_r[2];   // Identificador para las vidas del marcador
  15.  
  16.     s_golpe;        // Sonido de toque de ladrillo
  17.     s_pildora;      // Sonido de la píldoras de bonos
  18.     s_fuego;        // Sonido del disparo
  19.     s_metal;        // Sonido de toque con ladrillo metálico
  20.     s_raqueta;      // Sonido de la raqueta
  21.  
  22.     mapa[16*14];    // Mapa
  23.     vidas;          // Vidas restantes
  24.     nbolas;         // Numero de bolas
  25.     nladrillos;     // Numero de ladrillos que quedan
  26.     camb_dir;       // Cambia el control direccional de la paleta
  27.     rebota;         // Bandera. 1=rebota con ladrillos (pelota normal).
  28.                     //       0=no rebota (superbola)
  29.     fin_juego;      // Bandera 1=Final del juego
  30.     fase;           // Fase actual
  31.     puntuacion;     // Puntuación
  32.     demo;           // Bandera. 1=demo
  33.     id_bola;        // Identificador de la bola para la demo
  34.     id_texto;       // Identificador del texto del menú
  35.  
  36.     // Fichero de las fases (mapas)
  37.     fases[]=
  38.              "dat\noid\screen.1",
  39.              "dat\noid\screen.2",
  40.              "dat\noid\screen.3",
  41.              "dat\noid\screen.4",
  42.              "dat\noid\screen.5",
  43.              "dat\noid\screen.6",
  44.              "dat\noid\screen.7",
  45.              "dat\noid\screen.8",
  46.              "dat\noid\screen.9",
  47.              "dat\noid\screen.10",
  48.              "dat\noid\screen.11",
  49.              "dat\noid\screen.12";
  50.  
  51. LOCAL
  52.     estado=0;           // En el proceso bola: Bandera. 1=hace otra bola. 0=normal
  53.                         // En el proceso ladrillo: numero del contador de gráficos
  54.     tamaño_raqueta=4;   // Tamaño de la raqueta
  55.     parado=0;           // Bandera. 1=Bola parada. 0=bola en movimiento
  56.     velocidad=0;        // Velocidad de la bola
  57.  
  58. BEGIN
  59.     set_fps(30,0);              // Numero de pantallas por segundo
  60.     load_fpg("noid\noid.fpg");  // Carga gráficos
  61.     load_fpg("noid\noid2.fpg"); // Carga pantalla de presentación
  62.  
  63.     s_golpe=load_pcm("noid\caida7.pcm",0);    // Carga sonido
  64.     s_pildora=load_pcm("noid\fx34.pcm",0);
  65.     s_fuego=load_pcm("noid\disparo5.pcm",0);
  66.     s_metal=load_pcm("noid\metal10.pcm",0);
  67.     s_raqueta=load_pcm("noid\tubo.pcm",0);
  68.  
  69.     load_fnt("noid\noid.fnt");      // Carga la fuente de letras
  70.  
  71.     LOOP
  72.         scan_code=0;
  73.         WHILE (scan_code<>0)        // Espera a que se suelte la tecla
  74.             FRAME;
  75.         END
  76.         // Borra cualquier texto o proceso que existiera
  77.         delete_text(all_text);
  78.         let_me_alone();
  79.         put_screen(1,1);            // Pone la pantalla de fondo
  80.         load_pal("noid\noid2.fpg");
  81.         fade_on();
  82.         // Espera a que se pulse una tecla para continuar
  83.         REPEAT
  84.             FRAME;
  85.         UNTIL (scan_code<>0)
  86.         fade_off();
  87.         load_pal("noid\noid.fpg");
  88.         fin_juego=0;
  89.         demo=1;                                     // Empieza el modo demo
  90.         texto_demo();                               // Crea un proceso que pone un texto explicativo
  91.  
  92.         write_int(1,310,180,2,&puntuacion);         // Imprime puntuación
  93.  
  94.         // Valores iniciales
  95.         fin_juego=0;
  96.         fase=1;
  97.         puntuacion=0;
  98.         vidas=3;
  99.  
  100.         pequeño_r[0]=pequeña_raq(296,16+11*0);      // Imprime las vidas restantes
  101.         pequeño_r[1]=pequeña_raq(296,16+11*1);
  102.         pequeño_r[2]=pequeña_raq(296,16+11*2);
  103.         scan_code=0;
  104.         REPEAT
  105.             fade_on();              // Enciende la pantalla
  106.             clear_screen();         // Borra la pantalla
  107.             put(0,100+fase%4,0,0);  // Pone los gráficos de fondo
  108.             put(0,900,319,0);
  109.             nbolas=0;               // Reinicializa variables
  110.             camb_dir=1;
  111.             rebota=1;
  112.             id_bola=bola(raqueta());                // Crea la bola y la raqueta
  113.  
  114.             // Carga la fase y pone los ladrillos en la pantalla
  115.             load(fases[fase],&mapa);
  116.             nladrillos=0;   // Sirve para contar los ladrillos que se crean y pueden ser destruidos
  117.             FROM y=0 TO 13; // Va creando todos los ladrillos
  118.                 FROM x=0 TO 15;
  119.                     IF (mapa[y*16+x]<>0)
  120.                         ladrillo(16+x*16,12+y*8,mapa[y*16+x]);
  121.                         // Si el ladrillo se puede destruir entonces los cuenta
  122.                         IF ((mapa[y*16+x]<20) OR (mapa[y*16+x]>=30))
  123.                             nladrillos++;
  124.                         END
  125.                     END
  126.                 END
  127.             END
  128.             write_int(1,310,180,2,&puntuacion); // Imprime puntuación
  129.             LOOP    // Bucle general
  130.                 IF (key (_esc))                 // Comprueba la pulsación de escape
  131.                     IF (demo)                   // Si esta en modo demo, sale del programa
  132.                         creditos();
  133.                         FRAME;
  134.                     ELSE
  135.                         let_me_alone();         // Reinicia todo y sale al modo demo
  136.                         puntuacion=0;
  137.                         demo=1;
  138.                         fin_juego=1;            // Valores iniciales
  139.                         texto_demo();
  140.                     END
  141.                 END
  142.                 FRAME;
  143.                 // Cuando nladrillos<=0 y no esta cayendo nada, entonces la fase esta completada
  144.                 IF (((nladrillos<=0) OR (fin_juego)) AND (NOT (get_id(type pildora))) AND (NOT (get_id(type reduce))))
  145.                     BREAK;
  146.                 END
  147.             END
  148.  
  149.             // Siguiente fase o una vida menos
  150.             signal(TYPE bola,s_kill);
  151.             signal(TYPE raqueta,s_kill);
  152.             signal(TYPE pildora,s_kill);
  153.             signal(TYPE laser,s_kill);
  154.             signal(TYPE caido,s_kill);
  155.             signal(TYPE reduce,s_kill);
  156.             signal(TYPE ladrillo,s_kill);
  157.  
  158.             fase++;         // Cambia de fase
  159.             fade_off();     // Apaga la pantalla
  160.         UNTIL ((fase>11) OR (fin_juego))
  161.         // Repite hasta que se acabe el juego o se hagan todas las fases
  162.         fin_juego=0;
  163.         fade_off();
  164.         // Borra cualquier texto, la pantalla y la raqueta de la vidas
  165.         delete_text(all_text);
  166.         clear_screen();
  167.         signal(type pequeña_raq,s_kill);
  168.     END
  169.     signal(id,s_kill_tree);
  170. END
  171.  
  172. //------------------------------------------------------------------------------
  173. // Proceso raqueta
  174. // Controla la raqueta
  175. //------------------------------------------------------------------------------
  176.  
  177.  
  178. PROCESS raqueta();
  179.  
  180. PRIVATE
  181.     incr_x=0;               // Incremento x
  182.     incr_y=0;               // Incremento y
  183.     fuego_preparado=1;      // Bandera. 1=Disparo disponible
  184.     id2;                    // Identificador general
  185.     id3;                    // Identificador de carácter general
  186.  
  187. BEGIN
  188.     graph=3;                // Empieza con una raqueta normal
  189.     x=140;                  // Coordenadas iniciales
  190.     y=188;
  191.     // Espera si no hay bola
  192.     WHILE(NOT id_bola) FRAME; END
  193.     LOOP
  194.  
  195.         IF (NOT demo)       // El jugador controla la raqueta
  196.  
  197.             IF (camb_dir==1)
  198.                 // Comprueba la pulsación de las teclas de los cursores
  199.                 IF (key(_left) AND incr_x>-velocidad_r)
  200.                     incr_x-=4;  // Acelera
  201.                 ELSE
  202.                     IF (key(_right) AND incr_x<velocidad_r)
  203.                         incr_x+=4;  // Acelera
  204.                     ELSE            // Ninguna tecla pulsada
  205.                         IF (incr_x>0)
  206.                             incr_x-=2;
  207.                         END         // Frena la raqueta
  208.                         IF (incr_x<0)
  209.                             incr_x+=2;
  210.                         END
  211.                     END
  212.                 END
  213.             END
  214.             IF (camb_dir==-1)   // Mira si se ha cogido el icono de invertir mandos
  215.                 // Lee los mandos al reves
  216.                 IF (key(_right) AND incr_x>-velocidad_r)
  217.                     incr_x-=4;  // Acelera la raqueta
  218.                 ELSE
  219.                     IF (key(_left) AND incr_x<velocidad_r)
  220.                         incr_x+=4;
  221.                     ELSE        // Ninguna tecla pulsada
  222.                         IF (incr_x>0)
  223.                             incr_x-=2;
  224.                         END     // Frena la raqueta
  225.                         IF (incr_x<0)
  226.                             incr_x+=2;
  227.                         END
  228.                     END
  229.                 END
  230.             END
  231.  
  232.         ELSE  // El ordenador controla la raqueta (modo demo)
  233.             IF ((x>7) AND (x<310)) x=id_bola.x; END
  234.             IF (scan_code<>0)     // El jugador toma el control de la raqueta
  235.                 delete_text(all_text);          // Borra textos
  236.                 signal(type texto_demo,s_kill); // Elimina el proceso que pone el texto explicativo
  237.                 demo=0;                         // Quita el modo demo
  238.                 nladrillos=0;                   // Reinicia variables
  239.                 fase=-1;
  240.                 vidas=3;
  241.                 puntuacion=0;
  242.                 write_int(1,310,180,2,&puntuacion); // Imprime puntuación
  243.             END
  244.             IF (puntuacion>200) // Si hace más de 200 puntos cambia de fase (solo modo demo)
  245.                 nladrillos=0;
  246.                 fase=rand(-1,10);
  247.                 puntuacion=0;
  248.             END
  249.         END
  250.  
  251.         // Comprueba si se pulsa las teclas de disparo y se tiene la modalidad de disparo
  252.         IF ( (key(_space) OR key (_control) OR (demo AND rand(0,10)==0)) AND graph==6)
  253.             IF (fuego_preparado==1) // Si no ha disparado esta vez
  254.                 laser(x-16,y-8);    // Dispara los lasers...
  255.                 laser(x+16,y-8);
  256.                 IF (NOT demo) fuego_preparado=0; END // Y lo deja preparado para disparar de uno en uno
  257.             END
  258.         ELSE
  259.             fuego_preparado=1;      // Permite volver a disparar
  260.         END
  261.  
  262.         // Comprueba cuando coges una píldora de bonos
  263.         IF (id2=collision(TYPE pildora))
  264.             IF (id2.size==100)                  // Comprueba que no se halla cogido antes
  265.                 sound(s_pildora,80,256);
  266.                 puntuacion+=50;                 // Suma puntos
  267.                 SWITCH (id2.graph);             // Comprueba que tipo de pildora es
  268.                     CASE 200:                   // Píldora de extensión
  269.                         IF (tamaño_raqueta<8)   // Comprueba que extensión tiene actualmente
  270.                             tamaño_raqueta+=4;
  271.                         END
  272.                         IF (tamaño_raqueta==4)  // Coloca el gráfico dependiendo del tamaño
  273.                             graph=3;
  274.                         ELSE
  275.                             graph=4;
  276.                         END
  277.                         // Deja que la bola se mueva si es que estaba en modo pegamento
  278.                         WHILE (id3=get_id(TYPE bola))
  279.                             id3.parado=0;
  280.                         END
  281.                     END
  282.                     CASE 201:               // Píldora pegamento
  283.                         tamaño_raqueta=4;   // Pone el tamaño en normal
  284.                         graph=5;            // Selecciona el gráfico necesario
  285.                     END
  286.                     CASE 202:               // Píldora de disparo
  287.                         tamaño_raqueta=4;   // Pone el tamaño en normal
  288.                         graph=6;            // Selecciona el gráfico necesario
  289.                         WHILE (id3=get_id(TYPE bola))
  290.                             id3.parado=0;   // Quita el modo pegamento
  291.                         END
  292.                     END
  293.                     CASE 203:               // Píldora de vida extra
  294.                         IF (vidas<3)        // Si se tienen menos de 3 vidas, crea una más
  295.                             vidas++;
  296.                             pequeño_r[vidas-1]=pequeña_raq(296,16+11*(vidas-1));
  297.                         END;
  298.                     END
  299.                     CASE 204:               // Píldora de controles invertidos
  300.                         camb_dir=camb_dir*-1;
  301.                     END
  302.                     CASE 205:               // Reduce la raqueta
  303.                         IF (tamaño_raqueta>0)   // Reduce el tamaño de la raqueta si se puede
  304.                             tamaño_raqueta-=4;
  305.                         END
  306.                         IF (tamaño_raqueta==0)  // Selecciona el gráfico necesario
  307.                             graph=2;
  308.                         ELSE
  309.                             graph=3;
  310.                         END
  311.                         WHILE (id3=get_id(TYPE bola))
  312.                             id3.parado=0;       // Quita el modo pegamento si existiera
  313.                         END
  314.                     END
  315.                     CASE 206:               // Píldora de velocidad
  316.                         // Decrementa la velocidad de la bola si se puede
  317.                         WHILE (id3=get_id(TYPE bola))
  318.                             IF (id3.velocidad>800)
  319.                                 id3.velocidad-=400;
  320.                             ELSE
  321.                                 id3.velocidad=400;
  322.                             END
  323.                         END
  324.                     END
  325.                     CASE 207:                   // Píldora de superbola
  326.                         rebota=rebota XOR 1;    // Quita el rebote con los ladrillos
  327.                         WHILE (id3=get_id(TYPE bola))
  328.                             id3.graph=1+(1-rebota)*8;    // Cambia el gráfico
  329.                         END
  330.                     END
  331.                     CASE 208:               // Cambia los ladrillos indestructibles
  332.                         FRAME(0);           // Actualiza procesos
  333.                         // Va mirando los ladrillos y cambia los indestructibles
  334.                         WHILE (id3=get_id(TYPE ladrillo))
  335.                             IF ((id3.graph>=20) AND (id3.graph<30))
  336.                                 ladrillo(id3.x,id3.y,14);
  337.                                 signal(id3,s_kill);
  338.                                 id3.graph=14;
  339.                                 nladrillos++;
  340.                             END
  341.                         END
  342.                     END
  343.  
  344.                     CASE 209:               // Píldora de multibola
  345.                         get_id(TYPE bola).estado=1;
  346.                     END
  347.  
  348.                 END
  349.             END
  350.             id2.estado=1;   // Quita ese bonus
  351.         END
  352.         IF (NOT demo) x+=incr_x; END    // Si no esta en demo mueve la paleta
  353.  
  354.         // Limites de la pantalla según el tamaño
  355.         IF (x<23+tamaño_raqueta)
  356.             x=23+tamaño_raqueta;
  357.             incr_x=0;
  358.         END
  359.         IF (x>248-tamaño_raqueta)
  360.             x=248-tamaño_raqueta;
  361.             incr_x=0;
  362.         END
  363.         FRAME;
  364.     END
  365. END
  366.  
  367. //------------------------------------------------------------------------------
  368. // Proceso bola
  369. // Mueve la bola y comprueba las colisiones
  370. //------------------------------------------------------------------------------
  371.  
  372. PROCESS bola(id_raqueta);
  373.  
  374. PRIVATE
  375.     incr_x;         // Incremento x
  376.     incr_y;         // Incremento y
  377.     x_resol;        // 'x' con dos decimales
  378.     y_resol;        // 'y' con dos decimales
  379.     ultima_x_resol; // Ultima posición x_resol
  380.     ultima_y_resol; // Ultima posición y_resol
  381.     ángulo0;        // Movimiento del ángulo
  382.     avelocidad;     // Velocidad acumulada
  383.     dist_raqueta;   // Distancia entre la raqueta y la bola
  384.     pos_bol_raq;    // Posición de la bola en la raqueta
  385.     id_ladrillo;    // Identificador de ladrillo
  386.  
  387. BEGIN
  388.     z=-3;
  389.     graph=1+(1-rebota)*8;   // Gráfico de la bola
  390.     velocidad=400;          // Inicia variables propias del proceso
  391.     ángulo0=3*pi/8;
  392.  
  393.     LOOP
  394.  
  395.         IF (NOT parado)     // Si no esta en modo pegamento bola nueva
  396.             nbolas++;
  397.             parado=1;
  398.             pos_bol_raq=0;
  399.         ELSE
  400.             pos_bol_raq=x-id_raqueta.x; // Pegamento
  401.         END
  402.  
  403.         WHILE (parado)  // Repite mientras este en modo pegamento
  404.             // Coge las coordenadas respecto a la raqueta
  405.             x=id_raqueta.x+pos_bol_raq;
  406.             y=id_raqueta.y-8;
  407.             // Si se pulsa la tecla espacio
  408.             IF (key(_space) OR key (_control) OR demo)  // Lanza la bola
  409.                 parado=0;
  410.                 x_resol=x*100;
  411.                 y_resol=y*100;
  412.             END
  413.             FRAME;
  414.         END
  415.  
  416.         REPEAT
  417.  
  418.             IF (estado==1)       // Multibola
  419.                 nbolas+=2;
  420.                 CLONE           // Crea dos bolas más en otros ángulos
  421.                     ángulo0+=pi/32;
  422.                     CLONE
  423.                         ángulo0+=pi/32;
  424.                     END
  425.                 END
  426.                 estado=0;
  427.             END
  428.  
  429.             avelocidad+=velocidad;  // En cada impresión de pantalla suma avelocidad con velocidad
  430.  
  431.             WHILE (avelocidad>100)  // Comprueba la trayectoria y la colisión con los ladrillos
  432.  
  433.                 avelocidad-=100;
  434.  
  435.                 ultima_x_resol=x_resol;
  436.                 ultima_y_resol=y_resol;
  437.  
  438.                 incr_x=get_distx(ángulo0,100);
  439.                 x_resol+=incr_x;
  440.                 incr_y=get_disty(ángulo0,100);
  441.                 y_resol+=incr_y;
  442.  
  443.                 // Toca la raqueta
  444.                 dist_raqueta=x-id_raqueta.x;
  445.  
  446.                 // Toca la bola al ojo de la raqueta
  447.                 IF (y_resol>=18000 AND y_resol<=18800 AND incr_y>0 AND (dist_raqueta>-18-id_raqueta.tamaño_raqueta AND dist_raqueta<18+id_raqueta.tamaño_raqueta))
  448.  
  449.                     ángulo0=fget_angle(0,0,incr_x,-incr_y)-(dist_raqueta*pi/60);
  450.  
  451.                     // Angulo demasiado verticales no están permitidos
  452.                     IF (ángulo0<pi/8)
  453.                         ángulo0=pi/8;
  454.                     END
  455.                     IF (ángulo0>pi*7/8)
  456.                         ángulo0=pi*7/8;
  457.                     END
  458.  
  459.                     IF (id_raqueta.graph==5) // Raqueta pegamento
  460.                         parado=1;
  461.                         BREAK;
  462.                     END
  463.  
  464.                     sound(s_raqueta,100,256);
  465.                 END
  466.  
  467.                 // Colisiona con el lado horizontal del tablero
  468.                 IF (y_resol<=1200 AND incr_y<0)
  469.                     ángulo0=fget_angle(0,0,incr_x,-incr_y);
  470.                     sound(s_raqueta,80,500);
  471.                 END
  472.  
  473.                 // Colisiona con los lados verticales de la pantalla
  474.                 IF ((x_resol<=1200 AND incr_x<0) OR (x_resol>=26000 AND incr_x>0))
  475.                     ángulo0=fget_angle(0,0,-incr_x,incr_y);
  476.                     sound(s_raqueta,80,600);
  477.                 END
  478.  
  479.                 // Actualiza las coordenadas reales
  480.                 x=x_resol/100;
  481.                 y=y_resol/100;
  482.  
  483.                 // Comprueba si choca con un ladrillo
  484.                 IF (id_ladrillo=collision(TYPE ladrillo))
  485.                     puntuacion+=5;      // Suma puntuación y velocidad a la bola
  486.                     velocidad+=4;
  487.                     FRAME(0);           // Limpia comprobaciones de colisiones para volverlas a coger
  488.                     y=ultima_y_resol/100;
  489.  
  490.                     // Colisiona con el lado vertical de un ladrillo
  491.                     IF (id_ladrillo==collision(TYPE ladrillo))
  492.                             IF (rebota OR (id_ladrillo.graph>=20 AND id_ladrillo.graph<30))
  493.                             sound(s_metal,100,256);
  494.                             // Cambia el ángulo de manera vertical
  495.                             ángulo0=fget_angle(0,0,-incr_x,incr_y)+rand(-4000,4000);
  496.                             IF ((ángulo0<pi/8) AND (ángulo0>-pi/8))
  497.                                 ángulo0=fget_angle(0,0,-incr_x,incr_y);
  498.                             END
  499.                             IF ((ángulo0>pi*7/8) AND (ángulo0<pi*9/8))
  500.                                 ángulo0=fget_angle(0,0,-incr_x,incr_y);
  501.                             END
  502.                         END
  503.  
  504.                     ELSE
  505.                         IF (rebota OR (id_ladrillo.graph>=20 AND id_ladrillo.graph<30))
  506.                             sound(s_metal,100,256);
  507.  
  508.                             // Colisiona con el lado horizontal del ladrillo
  509.                             ángulo0=fget_angle(0,0,incr_x,-incr_y)+rand(-4000,4000);
  510.                             IF ((ángulo0<pi/8) AND (ángulo0>-pi/8))
  511.                                 ángulo0=fget_angle(0,0,incr_x,-incr_y);
  512.                             END
  513.                             IF ((ángulo0>pi*7/8) AND (ángulo0<pi*9/8))
  514.                                 ángulo0=fget_angle(0,0,incr_x,-incr_y);
  515.                             END
  516.                         END
  517.  
  518.                     END
  519.  
  520.                     x_resol=ultima_x_resol;     // Empuja la bola desde el ladrillo
  521.                     y_resol=ultima_y_resol;
  522.  
  523.                     IF (id_ladrillo.graph>=20 AND id_ladrillo.graph<30)
  524.                         id_ladrillo.estado=1;   // Ladrillos que no caen (indestructibles)
  525.                     ELSE
  526.                         // Ladrillos a los que tienes que dar varios toques
  527.                         IF (id_ladrillo.graph>=30 AND id_ladrillo.graph<33)
  528.                             id_ladrillo.graph++;    // Cambia el gráfico
  529.                             IF (id_ladrillo.graph==33)  // Si ha llegado a roto, elimina el ladrillo
  530.                                 signal(id_ladrillo,s_kill);
  531.                                 nladrillos--;
  532.                             END
  533.                         ELSE// Aqui se comprueban ladrillos normales
  534.                             // Aleatoriamente va creando pildoras
  535.                             IF (rand(0,100)<20)
  536.                                 pildora(id_ladrillo.x,id_ladrillo.y,rand(202,209));
  537.                             END
  538.                             // Crea un ladrillo de los que caen
  539.                             caido(id_ladrillo.x,id_ladrillo.y,id_ladrillo.graph);
  540.                             // Elimina el ladrillo
  541.                             signal(id_ladrillo,s_kill);
  542.                             nladrillos--;
  543.  
  544.                         END
  545.                     END
  546.  
  547.                 END
  548.  
  549.                 FRAME(0);   // Actualiza los procesos
  550.             END
  551.             x=x_resol/100;
  552.             y=y_resol/100;
  553.             FRAME;
  554.         UNTIL (y>200 OR parado) // Repite hasta que se salga de pantalla o en modo pegamento
  555.  
  556.         IF (NOT parado)     // Bola perdida
  557.             // Reinicia esta bola
  558.             velocidad=400;
  559.             ángulo0=3*pi/8;
  560.             nbolas--;       // Resta uno al contador de bolas
  561.             IF (nbolas>0)   // Si se tienen más bolas se sale
  562.                 BREAK;
  563.             ELSE            // Quita una raqueta cuando es la ultima bola
  564.                 fade_off();
  565.                 fade_on();
  566.                 camb_dir=1;
  567.                 rebota=1;
  568.                 graph=1;
  569.                 id_raqueta.graph=3;
  570.                 IF(vidas>0)
  571.                     signal(pequeño_r[vidas-1],s_kill);
  572.                 END
  573.                 signal(type pildora,s_kill);
  574.                 IF (NOT demo)   // Si no esta en modo demo quita una vida
  575.                     vidas--;
  576.                     IF (vidas<0)    // Si no quedan vidas se acaba el juego
  577.                         fin_juego=1;
  578.                         BREAK;
  579.                     END
  580.                 END
  581.             END
  582.         END
  583.  
  584.     END
  585. END
  586.  
  587. //------------------------------------------------------------------------------
  588. // Proceso ladrillo
  589. // Muestra los ladrillos
  590. //------------------------------------------------------------------------------
  591.  
  592. PROCESS ladrillo(x,y,graph);
  593.  
  594. PRIVATE
  595.     incr_x=1;               // Incremento x de los ladrillos rojos
  596.  
  597. BEGIN
  598.     z=-1;
  599.     SWITCH (graph);         // Comprueba que tipo de ladrillo es
  600.         CASE 15:            // Ladrillos se mueven
  601.             LOOP
  602.                 // Mueve los ladrillos
  603.                 IF (x==16) incr_x=1; END
  604.                 IF (x==256) incr_x=-1; END
  605.                 x+=incr_x;
  606.                 // Comprueba que no choca con otros ladrillos
  607.                 IF (collision(type ladrillo))
  608.                     incr_x=-incr_x;
  609.                     x+=incr_x;
  610.                 END
  611.                 FRAME;
  612.             END
  613.         END
  614.         CASE 20:            // Ladrillos indestructibles
  615.             LOOP
  616.                 IF (estado>0)   // Si se tocan hace una pequeña animación
  617.                     SWITCH (estado++);
  618.                         CASE 1:
  619.                             graph=21;
  620.                         END
  621.                         CASE 2:
  622.                             graph=22;
  623.                         END
  624.                         CASE 3:
  625.                             graph=21;
  626.                         END
  627.                         CASE 4:
  628.                             graph=20;
  629.                             estado=0;
  630.                         END
  631.                     END
  632.                 END
  633.                 FRAME;
  634.             END
  635.         END
  636.         DEFAULT:    // Por defecto entra en un bucle infinito
  637.             LOOP
  638.                 FRAME;
  639.             END
  640.         END
  641.     END
  642. END
  643.  
  644. //------------------------------------------------------------------------------
  645. // Proceso pildora
  646. // Muestra las píldoras de bonos
  647. //------------------------------------------------------------------------------
  648.  
  649. PROCESS pildora(x,y,graph);
  650.  
  651. BEGIN
  652.     z=-2;
  653.     // Mueve para abajo hasta que se coga o desaparezca de pantalla
  654.     WHILE (NOT out_region(id,0) AND estado==0)
  655.         y+=2;
  656.         FRAME;
  657.     END
  658.     // Reduce de tamaño cuando se coge al ladrillo o desaparece
  659.     WHILE (NOT out_region(id,0) AND size>0)
  660.         size-=10;
  661.         y+=1;
  662.         FRAME;
  663.     END
  664. END
  665.  
  666. //------------------------------------------------------------------------------
  667. // Proceso laser
  668. // Maneja el disparo
  669. //------------------------------------------------------------------------------
  670.  
  671. PROCESS laser(x,y);
  672.  
  673. PRIVATE
  674.     id_ladrillo;            // Identificador de ladrillo
  675.  
  676. BEGIN
  677.     graph=8;                // Selecciona gráfico
  678.     sound(s_fuego,80,400);  // Y realiza sonido
  679.     WHILE (y>8)
  680.         // Comprueba si toca a un ladrillo
  681.         IF (id_ladrillo=collision(TYPE ladrillo))
  682.             signal(id,s_kill);  // Elimina el disparo
  683.  
  684.             // Ladrillos indestructibles
  685.             IF (id_ladrillo.graph>=20 AND id_ladrillo.graph<30)
  686.                 // Pone la animación
  687.                 id_ladrillo.estado=1;
  688.             ELSE
  689.  
  690.                 // Ladrillo de muro
  691.                 IF (id_ladrillo.graph>=30 AND id_ladrillo.graph<40)
  692.                     // Adelanta un paso la destrucción
  693.                     id_ladrillo.graph++;
  694.                     // Comprueba si ha llegado al final
  695.                     IF (id_ladrillo.graph==33)
  696.                         // Destruye el ladrillo
  697.                         nladrillos--;
  698.                         // Para que desaparezca en pantalla se reduce el tamaño
  699.                         reduce(id_ladrillo.x,id_ladrillo.y,id_ladrillo.graph);
  700.                         signal(id_ladrillo,s_kill);
  701.                     END
  702.                 ELSE
  703.                     // En los ladrillos normales de vez en cuando crea un bonus
  704.                     IF (rand(0,100)<20)
  705.                         pildora(id_ladrillo.x,id_ladrillo.y,rand(200,209));
  706.                     END
  707.                     // Elimina el ladrillo y quita la visualización reduciendolo
  708.                     reduce(id_ladrillo.x,id_ladrillo.y,id_ladrillo.graph);
  709.                     signal(id_ladrillo,s_kill);
  710.                     nladrillos--;
  711.                 END
  712.             END
  713.         END
  714.         y-=8;   // Si no ha colisionado se mueve hacia arriba
  715.         FRAME;
  716.     END
  717. END
  718.  
  719. //------------------------------------------------------------------------------
  720. // Proceso caido
  721. // Mueve hacia abajo los ladrillo caídos
  722. //------------------------------------------------------------------------------
  723.  
  724. PROCESS caido (x,y,graph)
  725.  
  726. PRIVATE
  727.     iangulo;      // Incremento de ángulo
  728.  
  729. BEGIN
  730.     // Hace una sonido
  731.     sound(s_golpe,200,256);
  732.     // Elige un incremento del ángulo aleatoriamente
  733.     iangulo=rand(-pi/8,pi/8);
  734.  
  735.     REPEAT
  736.         FRAME;
  737.         y+=5;                   // Mueve el gráfico hacia abajo
  738.         angle+=iangulo;         // Mueve el ángulo con el incremento elegido
  739.     UNTIL (out_region(id,0))    // Repite hasta que desaparezca de pantalla
  740.  
  741. END
  742.  
  743. //------------------------------------------------------------------------------
  744. // Proceso reduce
  745. // Reduce el ladrillo
  746. //------------------------------------------------------------------------------
  747.  
  748. PROCESS reduce(x,y,graph)
  749.  
  750. BEGIN
  751.     REPEAT
  752.         FRAME;
  753.         size-=6;    // Cambia tamaño
  754.     UNTIL (size<0)  // Repite hasta que desaparezca por ser pequeño
  755. END
  756.  
  757. //------------------------------------------------------------------------------
  758. // Proceso pequeña_raq
  759. // Muestra la raqueta pequeñas (vidas)
  760. //------------------------------------------------------------------------------
  761.  
  762. PROCESS pequeña_raq(x,y)
  763.  
  764. BEGIN
  765.    graph=7;     // Selecciona gráfico
  766.    LOOP         // Entra en un bucle infinito
  767.         FRAME;
  768.    END
  769. END
  770.  
  771. //------------------------------------------------------------------------------
  772. // Proceso texto_demo
  773. // Imprime el texto de la demo
  774. //------------------------------------------------------------------------------
  775.  
  776. PROCESS texto_demo()
  777.  
  778. BEGIN
  779.     LOOP
  780.         // Escribe el texto
  781.         id_texto=write(1,90,100,0,"PULSA UNA TECLA PARA JUGAR");;
  782.         FRAME (2000);           // Espera 20 FRAMEs(impresión de pantalla)
  783.         delete_text(id_texto);  // Borra el texto
  784.         FRAME (2000);           // Espera 20 impresiones de pantalla
  785.     END
  786. END
  787.  
  788. //------------------------------------------------------------------------------
  789. // Proceso creditos
  790. // Imprime los mensajes de creditos
  791. //------------------------------------------------------------------------------
  792. PROCESS creditos()
  793.  
  794. PRIVATE
  795.     fuentec;    // Fuente usada en los créditos
  796.  
  797. BEGIN
  798.     fade_off();
  799.     delete_text(all_text);  // Borra otros textos o procesos
  800.     let_me_alone();
  801.     put_screen(1,2);        // Muestra la pantalla de presentacion
  802.     load_pal("noid\noid2.fpg");
  803.     // Carga los ficheros de fuentes de letras
  804.     fuentec=load_fnt("noid\noid2.fnt");
  805.  
  806.     // Imprime textos
  807.     write(fuentec,160,30,4,"- CREDITOS -");
  808.     write(fuentec,160,60,4,"PROGRAMADOR: LUIS SUREDA");
  809.     write(fuentec,160,80,4,"GRAFICOS: JOSE FERNANDEZ");
  810.     write(fuentec,160,100,4,"SONIDOS: CARLOS ILLANA");
  811.     write(fuentec,160,120,4,"COPYRIGHT 1997");
  812.     write(fuentec,160,140,4,"DIV GAMES STUDIO");
  813.     fade_on();
  814.  
  815.     // Espera hasta que se pulse cualquier tecla
  816.     WHILE (scan_code==0)
  817.         FRAME;
  818.     END
  819.     fade_off();                     // Apaga la pantalla
  820.     exit("Gracias por jugar!",0);   // Sale del programa
  821. END
  822.